/******************************************************************************
 *      Mestrado em Ci�ncia da Computa��o - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vin�cius Bueno
 *****************************************************************************/

#ifndef SERVER_H
#define SERVER_H

#include "socket.h"

#include "parser.h"

#include <pthread.h>
#include <time.h>

#define BACKLOG	5 // TO DO: fundamentar sobre o tamanho ideal do BACKLOG
#define TIMEOUT 2

/*
	Preenche o hints com informa��es locais;
	Efetua o loockup atrav�s do getaddrinfo;
	Abre o socket com as informa��es obtidas pelo lookup;
	Caso lg_reuseaddr = true, solicita ao SO o re�so do socket;
	Efetua o bind e retorna o socket fd;
*/
int srv_getboundsockfd(struct addrinfo *srv,vstring *port,int lg_reuseaddr);

/*
	Solicita para o SO o listen do socket descrito cujo fd passado foi por par�metro,
	inicia o listen que aceita 'backlog' conex�es na fila.
	Efetua verifica��o de erro.
	@param int sockfd: fd do socket repons�vel por ouvir as conex�es
	@param int backlog: n�mero m�ximo de conex�es na fila
*/
int srv_listen(int, int);

/******** connection_handle() *********************
 Dever� existir uma inst�ncia separada desta fun��o
 para cada conex�o. Ela trata toda a comunica��o
 uma vez que uma conex�o tenha sido estabelecida
	Utilizado tanto no servidor multi-processo
	quanto no servidor mult-thread
 *****************************************/

void connection_handle(int);

int server_recv(int, header_data **);

int recvtimeout(int s,vstring *buf,int timeout);

/*Rotinas usadas em threads */
//void persistent_connection(void*);
//void thread_timeout(void*);

#endif